#include "fmt.h"

#include "mem.h"

#include <string.h>
#include <assert.h>

static void
test_print()
{
    Fmt_print("");
    Fmt_print("hello\n"); // hello
    Fmt_print("%d,%d,%u,%x,%o\n", 127, -127, 127, 127, 127); // 127,-127,127,7f,177
    Fmt_print("%c\n", 'h');
    Fmt_print("%f,%e,%g\n", 3.14f, 3.14f, 3.14f);
    Fmt_print("%f,%e,%g\n", -3.14f, -3.14f, -3.14f);

    Fmt_print("%10d\n", 127);
    Fmt_print("%+10d\n", 127);

    Fmt_print("%-+10d\n", 127);
    Fmt_print("%- 10d\n", 127);
    Fmt_print("%-+10d\n", -127);

    Fmt_print("%010d\n", 127);

    Fmt_print("%.10d\n", 127);
    Fmt_print("%.10d\n", -127);
}

static void
test_sfmt()
{
    char buf[1024];
    int len = 1024;
    size_t ret;

    ret = Fmt_sfmt(buf, len, "%10d", 127);
    assert(strlen(buf) == ret);
    assert(strcmp(buf, "       127") == 0);

    Fmt_sfmt(buf, len, "%+10d", 127);
    assert(strlen(buf) == ret);
    assert(strcmp(buf, "      +127") == 0);

    ret = Fmt_sfmt(buf, len, "%-+10d", 127);
    assert(strlen(buf) == ret);
    assert(strcmp(buf, "+127      ") == 0);

    ret = Fmt_sfmt(buf, len, "%- 10d", 127);
    assert(strlen(buf) == ret);
    assert(strcmp(buf, " 127      ") == 0);

    ret = Fmt_sfmt(buf, len, "%-+10d", -127);
    assert(strlen(buf) == ret);
    assert(strcmp(buf, "-127      ") == 0);

    ret = Fmt_sfmt(buf, len, "%010d", 127);
    assert(strlen(buf) == ret);
    assert(strcmp(buf, "0000000127") == 0);

    ret = Fmt_sfmt(buf, len, "%.10d", 127);
    assert(strlen(buf) == ret);
    assert(strcmp(buf, "0000000127") == 0);

    ret = Fmt_sfmt(buf, len, "%.10d", -127);
    assert(strlen(buf) == ret);
    assert(strcmp(buf, "-0000000127") == 0);
}

static void
test_str()
{
    char *str;
    str = Fmt_string("%10d", 127);
    assert(strcmp(str, "       127") == 0);
    FREE(str);

    str = Fmt_string("%+10d", 127);
    assert(strcmp(str, "      +127") == 0);
    FREE(str);

    str = Fmt_string("%-+10d", 127);
    assert(strcmp(str, "+127      ") == 0);
    FREE(str);

    str = Fmt_string("%- 10d", 127);
    assert(strcmp(str, " 127      ") == 0);
    FREE(str);

    str = Fmt_string("%-+10d", -127);
    assert(strcmp(str, "-127      ") == 0);
    FREE(str);

    str = Fmt_string("%010d", 127);
    assert(strcmp(str, "0000000127") == 0);
    FREE(str);

    str = Fmt_string("%.10d", 127);
    assert(strcmp(str, "0000000127") == 0);
    FREE(str);

    str = Fmt_string("%.10d", -127);
    assert(strcmp(str, "-0000000127") == 0);
    FREE(str);
}

int main()
{
    test_print();
    test_sfmt();
    test_str();
    return 0;
}

